package com.jdd.modules.parking.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jdd.modules.parking.entity.InParkinglotCar;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jdd.modules.parkCarAbnormalRecord.vo.ParkCarAbnormalRecordVO;
import com.jdd.modules.parkCarAbnormalRecord.vo.QueryCarDetailsListDTO;
import com.jdd.modules.parking.entity.ParkCarEnterLog;
import com.jdd.modules.parking.vo.MontiorSearchRespVo;
import com.jdd.modules.parking.vo.QueryPageDetailsListVO;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * @Description: 车辆入场信息
 * @Author: jdd
 * @Date: 2021-02-20
 * @Version: V1.0
 */
public interface ParkCarEnterLogMapper extends BaseMapper<ParkCarEnterLog> {

    /**
     * 查询停车场的详细入场纪录
     *
     * @return 停车场详细入场纪录
     **/
    List<ParkCarEnterLog> enterLogDetails();

    /**
     * 修改车辆入场纪录中的出场状态
     *
     * @param
     **/
    Boolean updateIsOut(@Param("plateNo") String plateNO);

    int setOutByBatch(@Param("ids") List<String> ids);

    /**
     * 修改车辆入场纪录中的出场状态
     *
     * @param
     **/
    Boolean updateAreaIdIsOut(@Param("plateNo") String plateNO,@Param("areaId") String areaId);

    /**
     * 根据id修改是否出场状态
     *
     * @param id    入场记录id
     * @param isOut 是否出场状态
     * @return java.lang.Boolean
     * @author jdd孙庆伟
     * @date 2021/6/15 14:19:50
     * @version 1.0
     */
    Boolean IdUpdateIsOut(@Param("id") String id, @Param("isOut") String isOut);

    /**
     * 根据入场记录id修改云端保存成功失败状态
     *
     * @param id                入场记录id
     * @param synchronousStatus 云端保存成功失败状态
     * @author jdd孙庆伟
     * @version 1.0
     */
    void editSynchronousStatus(@Param("id") String id, @Param("synchronousStatus") String synchronousStatus);

    /**
     * 根据同步状态查询同步云端失败的入场记录
     *
     * @param synchronousStatus 同步状态 Y/N
     * @return java.util.List<com.jdd.modules.parking.entity.ParkCarEnterLog>
     * @author jdd孙庆伟
     * @date 2021/5/26 16:00:10
     * @version 1.0
     */
    List<ParkCarEnterLog> findBySynchronousStatus(@Param("synchronousStatus") String synchronousStatus);

    /**
     * 得到有牌车车辆所有未出场的入场纪录,并根据入场时间从大到小排列
     *
     * @param parkCode 车场编号
     * @param plateNo  车牌号
     * @return 入场纪录列表
     * @author: liuyaowen
     * @date 2021-07-30
     */
    List<ParkCarEnterLog> getCarAllNoOutEnterLogs(@Param("parkCode") String parkCode, @Param("plateNo") String plateNo);

    /**
     * 得到无牌车车辆所有未出场的入场纪录,并根据入场时间从大到小排列
     *
     * @param parkCode 车场编号
     * @param openId   微信OpenId
     * @return 入场纪录列表
     * @author: liuyaowen
     * @date 2021-07-30
     */
    List<ParkCarEnterLog> getNoPlateCarAllNoOutEnterLogs(@Param("parkCode") String parkCode, @Param("openId") String openId);

    /**
     * 查询指定区域内所有未出场车辆数
     *
     * @return 未出场车辆数
     * @author: LiuYaoWen
     * @date 2021-09-08
     */
    Integer getNoOutCarNumber();

    /**
     * 功能描述: 修改匹配得入场纪录车牌号改成出场时正确得车牌号
     *
     * @param id       入场时识别错的车牌记录id
     * @param plate_no 出场时识别对的车牌
     * @Author: lcy
     * @Date: 2021/9/27
     */
    void changePlate(@Param("id") String id, @Param("plate_no") String plate_no);

    /**
     * 功能描述: 通过两个参数得到最近的一条记录
     *
     * @param serialNo 车道序列号
     * @param plateNo  车牌和
     * @Author: lcy
     * @Date: 2021/11/18
     */
    String findIdBySerialAndPlate(@Param("serialNo") String serialNo, @Param("plateNo") String plateNo);

    /*** 功能描述: 监控页面入场纪录的查询数据
     * @Author: lcy
     * @Date: 2021/11/19
     */
    List<MontiorSearchRespVo> monitorList(@Param("plateNo") String plateNo, @Param("armName") String armName, @Param("serials") List<String> serials, @Param("swichType") String swichType, @Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("pageNo") Integer pageNo, @Param("pageSize") Integer pageSize);

    /*** 功能描述: 监控页面入场记录的总数居
     * @Author: lcy
     * @Date: 2021/11/19
     */
    List<MontiorSearchRespVo> monitorListAll(@Param("beginTime") String beginTime);

    /**
     * 更新出场状态
     */
    void updateCarEnterLogThisArea(@Param("areaId") String areaId, @Param("plateNo") String plateNo);

    /**
     * 分组取最新一条入场记录
     */
    List<ParkCarEnterLog> getGroupByMaxCarEnterLog(
            @Param("areaId") String areaId,
            @Param("plateNo") List<String> plateNo);

    /**
     * 查询车场内所有入场记录根据车牌号分组取最新一条数据
     */
    List<ParkCarEnterLog> getNewParkCarEnterLogGroupByPlateNo();

    /**
     * 查询第一次入场记录
     *
     * @param parkCode
     * @param plateNo
     * @return java.util.Date
     * @author jdd孙庆伟
     * @date 2022/3/12 15:06:06
     * @version 1.0
     */
    Date getOneEnterTime(@Param("parkCode") String parkCode, @Param("plateNo") String plateNo);

    /**
     * 根据区域ID和车牌号查询入场记录批次号
     */
    List<String> selectByAreaIdAndPlateNoList(@Param("areaId") String areaId, @Param("plateNo") String plateNo);

    /**
     * 根据批次号修改车牌号
     *
     * @param inParkingCar 入参
     * @return 修改结果
     */
    int updateByBatchNumber(InParkinglotCar inParkingCar);


    /**
     * 根据入场批次号 获取车辆当前批次号的出入记录
     * @param page
     * @param batchNumber
     * @param serialNo
     * @return
     */
    IPage<ParkCarAbnormalRecordVO> queryCarDetailsList(Page<ParkCarAbnormalRecordVO> page,@Param("batchNumber")  String batchNumber,@Param("serialNo")  String serialNo);

    List<QueryPageDetailsListVO> selectBatchNumberRecord(String batchNumber);
}
